#include <head.h>
/*
    #include <fcntl.h>
    #include <unistd.h>

    int fcntl(int fd,int cmd,struct flock *lock);
    功能：
        函数可以设置或获取文件描述符的属性或锁状态。
        与flock相比，fcntl提供了更细粒度的文件锁定控制，
        支持文件部分区域的加锁，适用于更复杂的文件所管理场景。
    参数：
        @fd：文件描述符。需要操作的文件
        @cmd：命令，用于指定要执行的操作，主要与文件锁相关的命令包括：
            F_GETLK：检查是否存在锁，并返回锁的状态。若锁被其他进程所占用，结构体flock钟会返回占用该锁的详细信息
            F_SETLK：以非阻塞模式设置文件锁。如果锁不可用，立即返回错误而不阻塞进程。
            F_SETLKW:以阻塞模式设置文件锁。如果锁不可用，进程会等待直到进程释放。
        @lock：指向'struct flock'结构体的指针，该结构体用于描述锁的类型、偏移量和范围。结构体包含以下成员：
            struct flock {
                short l_type;     // 锁的类型: F_RDLCK, F_WRLCK, F_UNLCK
                short l_whence;   // 偏移量的基准: SEEK_SET, SEEK_CUR, SEEK_END
                off_t l_start;    // 锁定区域的起始位置
                off_t l_len;      // 锁定区域的长度，0表示直到文件末尾
                pid_t l_pid;      // 持有锁的进程ID，主要在 F_GETLK 时使用
            };
    返回值：
        成功 返回0
        失败 返回-1，并设置相应的错误码
*/
int main(int argc, const char *argv[])
{
    int fd = open("example.txt", O_RDWR);
    if (fd < 0)
    {
        perror("open");
        exit(EXIT_FAILURE);
    }

    struct flock lock;
    lock.l_type = F_WRLCK; // 设置写锁
    lock.l_whence = SEEK_SET;
    lock.l_start = 0;
    lock.l_len = 0; // 锁定从当前位置到文件末尾

    if (fcntl(fd, F_SETLKW, &lock) < 0)
    {
        perror("fcntl");
        close(fd);
        exit(EXIT_FAILURE);
    }

    printf("File locked successfully.\n");

    // 进行文件操作

    // 解锁
    lock.l_type = F_UNLCK;
    if (fcntl(fd, F_SETLK, &lock) < 0)
    {
        perror("fcntl");
    }

    close(fd);
    return 0;
}
